/**
 * 将 3/6 位十六进制颜色解析为 RGB
 */
function parseHexColor(hex: string): { r: number; g: number; b: number } | null {
    if (typeof hex !== "string") return null;
    let s = hex.trim();
    if (s.startsWith("#")) s = s.slice(1);
    if (s.length === 3) {
        s = s.split("").map(ch => ch + ch).join(""); // 扩展至6位
    }
    if (!/^[0-9a-f]{6}$/i.test(s)) return null;
    const r = Number.parseInt(s.slice(0, 2), 16);
    const g = Number.parseInt(s.slice(2, 4), 16);
    const b = Number.parseInt(s.slice(4, 6), 16);
    return { r, g, b };
}

/**
 * 将 RGB 转为 6 位十六进制颜色
 */
function rgbToHex(r: number, g: number, b: number): string {
    const toHex = (n: number): string => Math.max(0, Math.min(255, Math.round(n)))
        .toString(16)
        .padStart(2, "0");
    return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}

/**
 * 规范化并钳制 level 值（支持 0-1 或 0-100），返回 0-1 的小数
 */
function normalizeLevel(level: number): number {
    if (!Number.isFinite(level)) return 0;
    // 若给到 0-1，直接使用；若给到 1-100，当作百分比
    const v = level > 1 ? level / 100 : level;
    return Math.max(0, Math.min(1, v));
}

/**
 * 颜色变深
 * @param color - hex 格式，如 #409eff 或 409eff 或 3 位如 #abc
 * @param level - 色值度，建议 0-100（也支持 0-1），数值越大越深
 * @returns 加深后的 hex 颜色（6 位）
 */
export function darkenColor(color: string, level: number): string {
    const rgb = parseHexColor(color);
    if (!rgb) return color; // 无法解析则原样返回
    const l = normalizeLevel(level);
    const r = rgb.r * (1 - l);
    const g = rgb.g * (1 - l);
    const b = rgb.b * (1 - l);
    return rgbToHex(r, g, b);
}

/**
 * 颜色变浅
 * @param color - hex 格式，如 #409eff 或 409eff 或 3 位如 #abc
 * @param level - 色值度，建议 0-100（也支持 0-1），数值越大越浅
 * @returns 变浅后的 hex 颜色（6 位）
 */
export function lightenColor(color: string, level: number): string {
    const rgb = parseHexColor(color);
    if (!rgb) return color; // 无法解析则原样返回
    const l = normalizeLevel(level);
    const r = rgb.r + (255 - rgb.r) * l;
    const g = rgb.g + (255 - rgb.g) * l;
    const b = rgb.b + (255 - rgb.b) * l;
    return rgbToHex(r, g, b);
}
